<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>



    // Promise根据异步操作结果改变状态 
    debugger;   // 同步代码执行时停下了
    var p = new Promise(function (resolve, reject) { // F11
        // (1) 构造函数Promise要求接收一个回调函数(所谓的容器),常用于接收异步操作(同步也可以)
        // (2) 接收的回调函数(容器)属于同步任务,在new Promise() 创建实例化对象过程中立即执行
        // (3) 回调函数的两个参数分别是resolve和reject(形参)。它们是两个函数，由 JavaScript 引擎提供，不用自己部署 (用于改变Promise实例的状态)

        console.log("Promise接收的的回调函数执行了");

        // 投硬币
        setTimeout(() => {   // F10
            debugger;   //异步代码执行时停下了
            var num = Math.random();   // 0-1 

            // 根据异步操作的结果, 自行决定如何改变状态 => 演示
            if (num > 0.5) { // 正面(不拖堂)
                resolve("老王不拖堂");  // {<fulfilled>:"老王不拖堂"}
            } else {  // 反面
                reject("老王拖堂了"); // {<rejected>: "老王拖堂了"}
            }
            console.log("异步任务执行了:" + num, p);
        }, 2000);



    });
    console.log(p);  //  {<pending>:undefined}



    /* 
       Promise实例的方法:  官方提供,专门供Promise实例使用的方法

       语法:   Promise实例.方法();
   
        
       then(resolveHandler,rejectHandler)   Promise实例生成以后，可以用then方法分别指定resolved状态和rejected状态的回调函数。
       resolveHandler  回调函数,当Promise实例由pending(进行中)变为fulfilled(已成功)执行此回调函数
       rejectHandler   回调函数,当Promise实例由pending(进行中)变为rejected(已失败)执行此回调函数

       resolveHandler()/rejectHandler()  两个函数是可选的
       resolveHandler()/rejectHandler() 都有一个形式参数,用于接收Promise实例中存储的数据(new Promise()中resolve和reject方法传递的数据)

       注意: 
        then()方法调用时,异步操作还没有执行,所以可以理解为then()提前制定了状态改变之后要执行的内容(回调函数),等异步操作有结果,Promise实例状态改变之后对应执行回调函数
   
   */

    // 指定Promise实例状态改变之后执行的回调函数
    p.then(function (arg) { // 
        debugger; // Promise实例变为已成功,执行回调函数
        console.log("fulfilled", arg);
    }, function (arg) {
        debugger; // Promise实例变为已失败,执行回调函数
        console.log("rejected", arg);
    })


    console.log("主线程所有同步代码执行完毕!");

</script>

</html>